const {keyi,Session,ResultCode} = require("./keyi.js")

function mAssert(value, message) {
  if (!value) {
    throw new Error(message)
  }
}

module.exports.simpleTest = function (config) {
  console.log("开始测试简单的网络验证场景")
  keyi.init(config.secretId,config.secretKey,config.projectId)
  const result = keyi.login(config.keyCode,config.machineId)
  mAssert(result,"登录失败，错误码："+keyi.errorCode)
  console.log("登录成功")
  for (let i = 0; i < 3; i++) {
    mAssert(keyi.tick(),"心跳失败")
    sleep(1000)
    console.log("心跳成功"+(i+1)+"/3次")
  }
  mAssert(keyi.logout(),"登出失败")
  console.log("登出成功")
  console.log("结束测试")
}

module.exports.deviceLimit = function (config) {
  console.log("开始测试设备限制场景,确保KeyCode是只支持单设备登录的卡密")
  console.log("登录设备1")
  const session1 = Session(config.secretId,config.secretKey,config.projectId)
  mAssert(session1.login(config.keyCode,config.machineId),"登录设备1失败")
  console.log("登录设备2")
  const session2 = Session(config.secretId,config.secretKey,config.projectId)
  mAssert(session2.login(config.keyCode,config.machineId),"登录设备2失败")
  console.log("因为机器码相同，设备2登录成功")
  console.log("测试设备1的心跳，因为设备2的登录，设备1会掉线，设备1的tick会失败")
  mAssert(session1.tick() === false,"设备1心跳成功")
  if(session1.errorCode !== ResultCode.kTooManyDevice){
    throw new Error("设备1心跳失败的错误码错误："+session1.errorCode)
  }
  console.log("测试设备2的心跳，设备2的tick会成功")
  mAssert(session2.tick(),"设备2心跳失败")
  console.log("登出设备2")
  mAssert(session2.logout(),"设备2登出失败")
  console.log("设备2登出成功")
  console.log("测试完成")
}

module.exports.deviceLimit2 = function(config) {
  console.log("开始测试设备限制场景,确保KeyCode是只支持单设备登录的卡密")
  console.log("登录设备1")
  const session1 = Session(config.secretId,config.secretKey,config.projectId)
  mAssert(session1.login(config.keyCode,config.machineId),"登录设备1失败")
  console.log("登录设备2,设备2会登录失败，因为设备1已经登录")
  const session2 = Session(config.secretId,config.secretKey,config.projectId)
  const result = session2.login(config.keyCode,config.machineId + "2")
  mAssert(result === false,"设备2登录成功")
  mAssert(session2.errorCode === ResultCode.kTooManyDevice,"设备2登录失败的错误码错误："+session2.errorCode)
  mAssert(session1.logout(),"设备1登出失败")
  console.log("设备1登出成功")
  console.log("测试完成")
}

module.exports.sessionTimeout = function(config) {
  console.log("开始测试Session超时场景")
  keyi.init(config.secretId,config.secretKey,config.projectId)
  mAssert(keyi.login(config.keyCode,config.machineId),"登录失败")
  console.log("登录成功")
  console.log("等待Session超时")
  for(let i = 0; i < 36; i++){
    console.log("还有"+(36-i)*10+"秒")
    sleep(10000)
  }
  mAssert(keyi.tick() === false,"心跳成功")
  mAssert(keyi.errorCode === ResultCode.kInvalidSessionTokenOrKey,"心跳失败的错误码错误："+keyi.errorCode)
  console.log("测试完成")
}

module.exports.suspendKeyCard = function(config) {
  console.log("开始测试卡密冻结场景，确保卡密是已冻结的卡密")
  keyi.init(config.secretId,config.secretKey,config.projectId)
  const r = keyi.login(config.keyCode,config.machineId)
  mAssert(r === false,"登录成功")
  mAssert(keyi.errorCode === ResultCode.kKeyCardSuspended,"登录失败的错误码错误："+keyi.errorCode)
  console.log("测试完成")
}

module.exports.suspendKeyCardOnRunning = function(config) {
  console.log("开始测试在脚本运行是冻结卡密的场景，确保当前卡密没有被冻结")
  keyi.init(config.secretId,config.secretKey,config.projectId)
  mAssert(keyi.login(config.keyCode,config.machineId),"登录失败")
  console.log("模拟冻结卡密，开始循环心跳，直到卡密被冻结后退出，因为会延迟10秒，所以冻结后并不会立即退出")
  let isRunning = true;
  while(isRunning) {
    var r = keyi.tick()
    if(r === false) {
      mAssert(keyi.errorCode === ResultCode.kKeyCardSuspended,"心跳失败的错误码错误："+keyi.errorCode)
      isRunning = false;
      console.log("卡密被冻结")
      break
    }
    sleep(5000)
  }
  console.log("测试完成")
}



